home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Sounds Terrific 2
/
Sounds Terrific II (1996)(Weird Science)(Disc 1 of 2)[Amiga-PC].iso
/
archives
/
amiga
/
tracker_4_31.lzh
/
tracker
/
display.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-05-11
|
14KB
|
709 lines
/* display.c
vi:ts=3 sw=3:
*/
/* $Id: display.c,v 4.21 1995/05/11 12:24:57 espie Exp espie $
* $Log: display.c,v $
* Revision 4.21 1995/05/11 12:24:57 espie
* DELAY +1.
*
* Revision 4.20 1995/03/11 21:40:38 espie
* Added jump_pattern, invert_loop.
*
* Revision 4.19 1995/03/04 00:16:00 espie
* Implemented vibrato control.
*
* Revision 4.18 1995/03/03 14:23:41 espie
* Color fixed (mostly).
*
* Revision 4.17 1995/02/27 14:24:23 espie
* Minor bug in dump_delimiter.
*
* Revision 4.16 1995/02/25 15:43:11 espie
* Display MUCH better.
*
* Revision 4.15 1995/02/24 15:36:39 espie
* Stupid bug: missing sample name in table (8)
*
* Revision 4.14 1995/02/21 21:13:16 espie
* Cleaned up source. Moved minor pieces of code around.
*
* Revision 4.13 1995/02/21 17:54:32 espie
* Internal problem: buggy RCS. Fixed logs.
*
* Revision 4.11 1995/02/20 22:28:50 espie
* tremolo.
*
* Revision 4.10 1995/02/20 16:49:58 espie
* Bug: need to check sample length against 0 before dividing.
*
* Revision 4.9 1995/02/14 04:02:28 espie
* Kludge for the amiga.
*
* Revision 4.7 1995/02/06 14:50:47 espie
* Changed sample_info.
*
* Revision 4.6 1995/02/01 20:41:45 espie
* Added color.
*
* Revision 4.5 1995/02/01 16:39:04 espie
* Includes moved to defs.h
*
* Revision 4.0 1994/01/11 17:45:22 espie
* Major change: does not use sprintf heavily.
*
* Generalized open.c.
* Use name_of_note(), no need for run_in_fg().
* Small bug: strcpy -> stringcopy.
* Cond code to make show/not show robust.
* Added instrument name as shown per display.c.
* Major change: use scroller interface.
* Lots of LOCAL added + minor changes.
* Try to get rid of %d format in printf.
*/
#include "defs.h"
#include "song.h"
#include "channel.h"
#include "extern.h"
#include "tags.h"
#include "prefs.h"
ID("$Id: display.c,v 4.21 1995/05/11 12:24:57 espie Exp espie $")
LOCAL void init_display P((void));
LOCAL void (*INIT)P((void)) = init_display;
#define ENTRY_SIZE 14
LOCAL char *base;
/* lookup tables for speed */
LOCAL char *num[] = {
" 0", " 1", " 2", " 3", " 4", " 5", " 6", " 7", " 8", " 9",
"10", "11", "12", "13", "14", "15", "16", "17", "18", "19",
"20", "21", "22", "23", "24", "25", "26", "27", "28", "29",
"30", "31", "32", "33", "34", "35", "36", "37", "38", "39",
"40", "41", "42", "43", "44", "45", "46", "47", "48", "49",
"50", "51", "52", "53", "54", "55", "56", "57", "58", "59",
"60", "61", "62", "63", "64", "65", "66", "67", "68", "69",
"70", "71", "72", "73", "74", "75", "76", "77", "78", "79",
"80", "81", "82", "83", "84", "85", "86", "87", "88", "89",
"90", "91", "92", "93", "94", "95", "96", "97", "98", "99",
"00", "01", "02", "03", "04", "05", "06", "07", "08", "09"};
char instname[] = { ' ', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};
LOCAL void reset_buffer()
{
base = new_scroll();
}
LOCAL void next_entry()
{
if (get_pref_scalar(PREF_COLOR))
base += 7;
base += ENTRY_SIZE;
}
/* utility functions to avoid the overhead of strncpy */
LOCAL void copy1(to, from)
char *to, *from;
{
*to = *from;
}
LOCAL void copy2(to, from)
char *to, *from;
{
*to++ = *from++;
*to = *from;
}
LOCAL void copy3(to, from)
char *to, *from;
{
*to++ = *from++;
*to++ = *from++;
*to = *from;
}
LOCAL void copy4(to, from)
char *to, *from;
{
*to++ = *from++;
*to++ = *from++;
*to++ = *from++;
*to = *from;
}
LOCAL void stringcopy(to, from)
char *to, *from;
{
while (*from)
*to++ = *from++;
}
LOCAL void num2(to, n)
char *to;
int n;
{
char *v = num[n];
*to++ = *v++;
*to = *v;
}
LOCAL void num3(to, n)
char *to;
int n;
{
char *v;
if (n >= 100)
*to = "0123456789"[n/100];
while (n > 109)
n -= 100;
v = num[n];
to++;
*to++ = *v++;
*to = *v;
}
LOCAL void (*table[NUMBER_EFFECTS]) P((int samp, int para, int note, \
struct channel *ch));
/* all the various dump for the effects */
LOCAL void disp_default(samp, para, note, ch)
int samp, para, note;
struct channel *ch;
{
if (ch->samp->start)
copy3(base+2, name_of_note(note));
}
LOCAL void disp_speed(samp, para, note, ch)
int samp, para, note;
struct channel *ch;
{
if (ch->samp->start)
copy3(base+2, name_of_note(note));
if (para < 32)
{
stringcopy(base+6, "SPD");
num2(base+10, para);
}
else
{
stringcopy(base+6, "spd%");
num3(base+10, para * 100/NORMAL_FINESPEED);
}
}
LOCAL void disp_nothing(samp, para, note, ch)
int samp, para, note;
struct channel *ch;
{
}
LOCAL void disp_portamento(samp, para, note, ch)
int samp, para, note;
struct channel *ch;
{
if (ch->samp->start)
{
stringcopy(base+2, "-->");
copy3(base+5, name_of_note(note));
if (para)
{
base[8] = '(';
num3(base+9, para);
base[12] = ')';
}
}
}
LOCAL void disp_portaslide(samp, para, note, ch)
int samp, para, note;
struct channel *ch;
{
if (ch->samp->start)
{
stringcopy(base+2, "-->");
copy3(base+5, name_of_note(note));
if (LOW(para))
{
base[9] = '-';
num2(base+10, LOW(para));
}
else
{
base[9] = '+';
num2(base+10, HI(para));
}
}
}
LOCAL void disp_upslide(samp, para, note, ch)
int samp, para, note;
struct channel *ch;
{
if (ch->samp->start)
{
copy3(base+2, name_of_note(note));
base[8] = '-';
if (para)
num3(base+9, para);
}
}
LOCAL void disp_downslide(samp, para, note, ch)
int samp, para, note;
struct channel *ch;
{
if (ch->samp->start)
{
copy3(base+2, name_of_note(note));
base[8] = '+';
if (para)
num3(base+9, para);
}
}
LOCAL void disp_vibrato(samp, para, note, ch)
int samp, para, note;
struct channel *ch;
{
if (ch->samp->start)
copy3(base+2, name_of_note(note));
if (para || ch->samp->start)
copy2(base+6, "vb");
if (para)
{
num2(base+8, LOW(para));
base[10] = '/';
num2(base+11, HI(para));
}
}
LOCAL void disp_vibrato_wave(samp, para, note, ch)
int samp, para, note;
struct channel *ch;
{
if (ch->samp->start)
copy3(base+2, name_of_note(note));
copy2(base+6, "vb");
switch(para)
{
case 0:
copy4(base+9, "sine");
break;
case 1:
copy4(base+9, "sqre");
break;
case 2:
copy4(base+9, "ramp");
break;
case 4:
copy4(base+9, "SINE");
break;
case 5:
copy4(base+9, "SQRE");
break;
case 6:
copy4(base+9, "RAMP");
break;
default:
copy4(base+9, "????");
}
}
LOCAL void disp_tremolo_wave(samp, para, note, ch)
int samp, para, note;
struct channel *ch;
{
if (ch->samp->start)
copy3(base+2, name_of_note(note));
copy2(base+6, "tr");
switch(para)
{
case 0:
copy4(base+9, "sine");
break;
case 1:
copy4(base+9, "sqre");
break;
case 2:
copy4(base+9, "ramp");
break;
case 4:
copy4(base+9, "SINE");
break;
case 5:
copy4(base+9, "SQRE");
break;
case 6:
copy4(base+9, "RAMP");
break;
default:
copy4(base+9, "????");
}
}
LOCAL void disp_tremolo(samp, para, note, ch)
int samp, para, note;
struct channel *ch;
{
if (ch->samp->start)
copy3(base+2, name_of_note(note));
if (para || ch->samp->start)
copy2(base+6, "tr");
if (para)
{
num2(base+8, LOW(para));
base[10] = '/';
num2(base+11, HI(para));
}
}
LOCAL void disp_vibratoslide(samp, para, note, ch)
int samp, para, note;
struct channel *ch;
{
if (ch->samp->start)
{
copy3(base+2, name_of_note(note));
stringcopy(base+6, "vibs");
if (LOW(para))
{
base[10] = '-';
num2(base+11, LOW(para));
}
else
{
base[10] = '+';
num2(base+11, HI(para));
}
}
}
LOCAL void disp_slidevol(samp, para, note, ch)
int samp, para, note;
struct channel *ch;
{
if (ch->samp->start)
{
copy3(base+2, name_of_note(note));
stringcopy(base+6, "vol");
if (LOW(para))
{
base[10] = '-';
num2(base+11, LOW(para));
}
else
if (HI(para))
{
base[10] = '+';
num2(base+11, HI(para));
}
}
}
LOCAL void disp_volume(samp, para, note, ch)
int samp, para, note;
struct channel *ch;
{
if (ch->samp->start)
{
copy3(base+2, name_of_note(note));
if (para)
{
stringcopy(base+6, "vol");
num3(base+10, para);
}
else
stringcopy(base+6, "silent");
}
}
LOCAL void disp_arpeggio(samp, para, note, ch)
int samp, para, note;
struct channel *ch;
{
if (ch->samp->start)
{
if (note != NO_NOTE)
{
copy3(base+2, name_of_note(note));
copy3(base+6, name_of_note(note + LOW(para)));
copy3(base+10, name_of_note(note + HI(para)));
}
else
if (ch->note == NO_NOTE)
stringcopy(base, "Arp error");
else
{
copy3(base+6, name_of_note(ch->note + LOW(para)));
copy3(base+10, name_of_note(ch->note + HI(para)));
}
}
}
LOCAL void disp_retrig(samp, para, note, ch)
int samp, para, note;
struct channel *ch;
{
if (ch->samp->start)
{
copy3(base+2, name_of_note(note));
stringcopy(base + 6, "rtg");
num3(base+9, para);
}
}
LOCAL void disp_note_cut(samp, para, note, ch)
int samp, para, note;
struct channel *ch;
{
if (ch->samp->start)
{
copy3(base+2, name_of_note(note));
stringcopy(base+6, "cut");
num3(base+9, para);
}
}
LOCAL void disp_late_start(samp, para, note, ch)
int samp, para, note;
struct channel *ch;
{
if (ch->samp->start)
{
copy3(base+2, name_of_note(note));
stringcopy(base+6, "lte");
num3(base+9, para);
}
}
LOCAL void disp_offset(samp, para, note, ch)
int samp, para, note;
struct channel *ch;
{
if (ch->samp->start)
{
copy3(base+2, name_of_note(note));
stringcopy(base+6, "off %");
if (ch->samp->length)
num3(base+9, para * 25600/ch->samp->length);
}
}
LOCAL void disp_smooth_up(samp, para, note, ch)
int samp, para, note;
struct channel *ch;
{
if (ch->samp->start)
{
copy3(base+2, name_of_note(note));
stringcopy(base+6, "sth-");
num3(base+10, para);
}
}
LOCAL void disp_smooth_down(samp, para, note, ch)
int samp, para, note;
struct channel *ch;
{
if (ch->samp->start)
{
copy3(base+2, name_of_note(note));
stringcopy(base+6, "sth+");
num3(base+10, para);
}
}
LOCAL void disp_smooth_upvolume(samp, para, note, ch)
int samp, para, note;
struct channel *ch;
{
if (ch->samp->start)
{
copy3(base+2, name_of_note(note));
stringcopy(base+8, "++");
num3(base+10, para);
}
}
LOCAL void disp_smooth_downvolume(samp, para, note, ch)
int samp, para, note;
struct channel *ch;
{
if (ch->samp->start)
{
copy3(base+2, name_of_note(note));
stringcopy(base+8, "--");
num3(base+10, para);
}
}
LOCAL void disp_change_finetune(samp, para, note, ch)
int samp, para, note;
struct channel *ch;
{
if (ch->samp->start)
{
copy3(base+2, name_of_note(note));
stringcopy(base+6, "fine");
num2(base+11, para);
}
}
LOCAL void disp_skip(samp, para, note, ch)
int samp, para, note;
struct channel *ch;
{
if (ch->samp->start)
copy3(base+2, name_of_note(note));
if (para)
{
stringcopy(base+6, "skp");
num3(base+10, para);
}
else
stringcopy(base+6, "next");
}
LOCAL void disp_fastskip(samp, para, note, ch)
int samp, para, note;
struct channel *ch;
{
if (ch->samp->start)
copy3(base+2, name_of_note(note));
stringcopy(base+6, "ff");
num3(base+10, para);
}
LOCAL void disp_loop(samp, para, note, ch)
int samp, para, note;
struct channel *ch;
{
if (ch->samp->start)
copy3(base+2, name_of_note(note));
if (para == 0)
stringcopy(base+6, "SETLOOP");
else
{
stringcopy(base+6, "LOOP");
num3(base+10, para+1);
}
}
LOCAL void disp_delay_pattern(samp, para, note, ch)
int samp, para, note;
struct channel *ch;
{
if (ch->samp->start)
copy3(base+2, name_of_note(note));
stringcopy(base+6, "DLAY");
num3(base+10, para);
}
LOCAL void disp_gliss_ctrl(samp, para, note, ch)
int samp, para, note;
struct channel *ch;
{
if (ch->samp->start)
copy3(base+2, name_of_note(note));
if (para)
stringcopy(base+6, "gls on");
else
stringcopy(base+6, "gls off");
}
LOCAL void disp_invert_loop(samp, para, note, ch)
int samp, para, note;
struct channel *ch;
{
if (ch->samp->start)
copy3(base+2, name_of_note(note));
if (para)
{
stringcopy(base+6, "inv");
num3(base+10, para);
}
else
stringcopy(base+6, "inv off");
}
#define disp_nothing disp_default
LOCAL void init_display()
{
int i;
for (i = 0; i < NUMBER_EFFECTS; i++)
table[i] = disp_nothing;
table[EFF_VIBRATO_WAVE] = disp_vibrato_wave;
table[EFF_TREMOLO_WAVE] = disp_tremolo_wave;
table[EFF_GLISS_CTRL] = disp_gliss_ctrl;
table[EFF_ARPEGGIO] = disp_arpeggio;
table[EFF_SPEED] = disp_speed;
table[EFF_SKIP] = disp_skip;
table[EFF_FF] = disp_fastskip;
table[EFF_VOLUME] = disp_volume;
table[EFF_VOLSLIDE] = disp_slidevol;
table[EFF_OFFSET] = disp_offset;
table[EFF_PORTA] = disp_portamento;
table[EFF_PORTASLIDE] = disp_portaslide;
table[EFF_UP] = disp_upslide;
table[EFF_DOWN] = disp_downslide;
table[EFF_VIBRATO] = disp_vibrato;
table[EFF_TREMOLO] = disp_tremolo;
table[EFF_VIBSLIDE] = disp_vibratoslide;
table[EFF_SMOOTH_UP] = disp_smooth_up;
table[EFF_SMOOTH_DOWN] = disp_smooth_down;
table[EFF_CHG_FTUNE] = disp_change_finetune;
table[EFF_LOOP] = disp_loop;
table[EFF_RETRIG] = disp_retrig;
table[EFF_S_UPVOL] = disp_smooth_upvolume;
table[EFF_S_DOWNVOL] = disp_smooth_downvolume;
table[EFF_NOTECUT] = disp_note_cut;
table[EFF_LATESTART] = disp_late_start;
table[EFF_DELAY] = disp_delay_pattern;
table[EFF_INVERT_LOOP] = disp_invert_loop;
reset_buffer();
}
void dump_event(ch, e)
struct channel *ch;
struct event *e;
{
INIT_ONCE;
if (ch && base) /* do we have a scroll line AND are we not finished */
{
if (get_pref_scalar(PREF_COLOR))
base = write_color(base, ch->samp->color);
if (ch->samp != empty_sample())
*base = instname[e->sample_number];
(*table[e->effect])(e->sample_number, e->parameters, e->note, ch);
next_entry();
}
else
{
scroll();
reset_buffer();
}
}
void dump_delimiter()
{
INIT_ONCE;
if (base)
#ifdef AMIGA
*base++;
#else
*base++= '|';
#endif
}